/-app
/-core
/-headers
/-imports
/-io
/-managed ...
/-managed/metadata
/-managed/metadata/enums
-enums.ts
AssemblyHashAlgorithm.ts
ClrImageFlags.ts
ClrMetadataSignature.ts
TableKind.ts
ClrDirectory.ts
ClrMetadata.ts
CodedIndexReader.ts
MetadataStreams.ts
TableCompletionReader.ts
TableReader.ts
TableStream.ts
bits.ts
/-managed/tables
AppDomain.ts
Assembly.ts
ConstructedGenericType.ts
EventInfo.ts
FieldInfo.ts
MethodInfo.ts
ParameterInfo.ts
PropertyInfo.ts
Type.ts
TypeReference.ts
/-typings
/-unmanaged
pe.html
pe.ts
72
  }
73
 
74
 
75
  class AssemblyReading {
76
    reader: io.BufferReader = null;
77
    fileHeaders: headers.PEFileHeaders = null;
78
    clrDirectory: metadata.ClrDirectory = null;
79
    clrMetadata: metadata.ClrMetadata = null;
80
    metadataStreams: metadata.MetadataStreams = null;
81
    tableStream: metadata.TableStream = null;
82
 
83
    constructor(public appDomain: AppDomain) {
84
    }
85
 
86
    read(reader: io.BufferReader): Assembly {
87
      reader.offset = 0;
88
      this.reader = reader;
89
      this.readFileHeaders();
90
      this.readClrDirectory();
91
      this.readClrMetadata();
92
      this.readMetadataStreams();
93
      this.readTableStream();
94
 
95
      this.populateStrings(this.tableStream.stringIndices, reader);
96
 
97
      var mscorlib = this._getMscorlibIfThisShouldBeOne();
98
      if (mscorlib)
99
        this.tableStream.tables[metadata.TableKind.Assembly][0].def = mscorlib;
100
      
101
      this.completeTables();
102
 
103
      return this._createAssemblyFromTables();
104
    }
105
 
106
    private _createAssemblyFromTables() {
107
      var stringIndices = this.tableStream.stringIndices;
108
 
109
      var assembly = this._getMscorlibIfThisShouldBeOne();
110
 
111
      var replaceMscorlibTypes = assembly ? assembly.types.slice(0, assembly.types.length) : null;
112
 
113
      var referencedAssemblies: Assembly[] = [];
114
      var assemblyRefTable: tables.AssemblyRef[] = this.tableStream.tables[0x23];  // AssemblyRef
115
      if (assemblyRefTable) {
116
        for (var i = 0; i < assemblyRefTable.length; i++) {
117
          var assemblyRefRow = assemblyRefTable[i];
118
 
119
          var assemblyRefName = stringIndices[assemblyRow.name];
120
          var assemblyRefVersion = assemblyRow.majorVersion + "." + assemblyRow.minorVersion + "." + assemblyRow.revisionNumber + "." + assemblyRow.buildNumber;
121
          var assemblyRefAttributes = assemblyRow.flags;
122
          var assemblyRefPublicKey = this._readBlobHex(assemblyRow.publicKey);
123
          var assemblyRefCulture = stringIndices[assemblyRow.culture];
124
 
125
          var referencedAssembly = this.appDomain.resolveAssembly(
126
            assemblyRefName,
127
            assemblyRefVersion,
128
            assemblyRefPublicKey,
129
            assemblyRefCulture);
130
 
131
          if (referencedAssembly.isSpeculative)
132
            referencedAssembly.attributes = assemblyRefAttributes;
133
 
134
          referencedAssemblies.push(referencedAssembly);
135
        }
136
      }
137
 
138
      if (typeDefTable) {
139
        for (var i = 0; i < typeDefTable.length; i++) {
140
          var typeDefRow: tables.TypeDef = typeDefTable[i];
141
 
142
          var typeName = stringIndices[typeDefRow.name];
143
          var typeNamespace = stringIndices[typeDefRow.namespace];
144
 
145
          var type: Type = null;
146
 
147
          if (replaceMscorlibTypes && typeNamespace === "System") {
148
            for (var ityp = 0; ityp < replaceMscorlibTypes.length; ityp++) {
149
              var typ = replaceMscorlibTypes[ityp];
150
              if (typ.name === typeName) {
151
                type = typ;
152
                break;
153
              }
154
            }
155
          }
156
 
157
          if (!type) {